package org.willthink.common;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.willthink.vo.common.PagingValuesVo;

public class PagingProcessUtil {
	
	private Logger logger = LoggerFactory.getLogger(getClass());
	
	int pageNumber; // 페이지 번호
	int totalPageCount; // 리스트에 나타내야할 전체 페이지 갯수
	int blockNumber; // 범위번호 == 영역번호
	int firstPageNumber; // 첫번째 페이지 번호
	int endPageNumber; // 마지막 페이지 번호
	int firstRow; // 한페이지당 보여줄 레코드 행수를 구하는 조건으로 사용
	int endRow; // 한페이지당 보여줄 레코드 행수를 구하는 조건으로 사용
	int totalRowCnt; // 디비에서 읽어온 전체 레코드 행수 
	
	public PagingValuesVo getPagingProcess(String strPageNumber, int totalRow) {
		
		logger.debug("PagingProcessUtil strPageNumber : {}", strPageNumber);
		logger.debug("PagingProcessUtil totalRow : {}", totalRow);
		
		if(strPageNumber == null || strPageNumber.equals("")) {
			pageNumber = 1;
		} else {
			pageNumber = Integer.parseInt(strPageNumber.trim());
		}
		
		// 리스트에 보여줄 레코드 행수 범위
		int rowRange = 10; 
		
		// 전체 레코드 행수
		this.totalRowCnt = totalRow; 				
		
		// 리스트에 나타내야할 전체 페이지 갯수
		totalPageCount = totalRowCnt % rowRange == 0 ? 
				    (totalRowCnt / rowRange) : // 참일때
				    (totalRowCnt / rowRange) + 1; // 거짓일때
		
		// 전체 레코드 행수가 0일때 페이지 번호가 보여질수 없으므로
		if (totalPageCount == 0) {  
			totalPageCount = 0; 
		}
		
		// 디비에서 읽어올 첫번째행
		firstRow = (pageNumber - 1) * rowRange + 1; 
		
		// 디비에서 읽어올 끝행
		endRow = firstRow + rowRange - 1; 
		
		// 디비에서 읽어온 총레코드 행수가 디비에서 읽어올 끝행보다 작거나 같으면 
		if (totalRowCnt <= endRow) { 
			endRow = totalRowCnt;
		}
		
		// 리스트에 뿌려질 페이지 번호의 갯수의 범위
		// 페이지 번호의 갯수 단위로(pageNumberCount) 단위 번호 == 범위 번호(blockNumber)을 갖는다.
		// 예) pageNumberCount가 10이면 [1][2][3][4][5][6][7][8][9][10]
		int pageNumberCount = 10; 
		
		// 단위 번호 == 범위 번호
		// [1][2][3][4][5][6][7][8][9][10] => 단위 번호 == 범위번호 == 페이지번호 10개가 한 단위 == 1
		blockNumber =  pageNumber % pageNumberCount == 0 ? 
				               (pageNumber / pageNumberCount) : //참일때
				               (pageNumber / pageNumberCount) + 1; //거짓일때
		
		// 첫 페이지 번호 예) [1]
	    firstPageNumber = (blockNumber - 1) * pageNumberCount + 1; 
		
		// 끝 페이지 번호 예 [10]
	    endPageNumber =  firstPageNumber + pageNumberCount - 1; 
		
		return new PagingValuesVo(firstRow, endRow, totalPageCount, blockNumber, firstPageNumber, endPageNumber);
	}

}
